AWS 完成了需要的設定,但 GitHub 還沒做好準備啊!
登入設定完成只是開頭,完整流程還沒串起來呢 ↓
GitHub Push → GitHub Actions 觸發 → OIDC 驗證 → Assume Role → Deploy Lambda
前篇已經完成 AWS OIDC 的設定,並建立了一個提供 Web 登入的 IAM Role。
這兩個步驟看似不連貫,其實都是為後續的自動化部署做準備。
在建立 IAM Role 的時候,信任政策(Trust Policy)中有一段內容對「誰可以取用這個 Role」做了限制:
"StringLike": {
"token.actions.githubusercontent.com:sub": [
"repo:MinxSu/ITHome-ironman-2025:ref:refs/heads/develop"
]
}
專案:MinxSu
Repository:ITHome-ironman-2025
分支:develop
如果沒有完全符合以上條件,是無法使用這個 Role 的。
所以...
ITHome-ironman-2025/ # 專案資料夾
├── lambda_function.py # 程式碼
├── bedrock_service.py
├── ....py
├── requirements.txt # 引入套件清單
└── .github/ # GitHub 用設定檔路徑
└── workflows/ # GitHub Actions workflow 的預設讀取路徑
└── oidc-test.yml # yaml 設定檔案,檔名無預設可自行設定
name: OIDC Test
on:
workflow_dispatch: # 這代表手動觸發測試
jobs:
aws-test:
runs-on: ubuntu-latest
permissions:
id-token: write # 必要,才能用 OIDC 跟 AWS 交換暫時憑證
contents: read
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Configure AWS credentials from OIDC
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Test AWS CLI
run: |
aws sts get-caller-identity
在這段 yaml 語法中,有兩個設定值不是直接寫在語法中,而是設定在 GitHub 的 secrets
GitHub Secrets 是 GitHub 提供的加密變數機制
可安全儲存敏感資訊(像 API 金鑰、密碼、權杖),並可被 GitHub 本身的自動化功能(如 Actions、Dependabot、Codespaces)使用。
不同功能的 Secrets 是各自獨立的,互不共用。
設定完成後無法從 GitHub 網站上檢視設定值,只能重新設定。
設定 GitHub Secrets
設定位置:Settings 分頁 > Secrets and variables > Actions > New repository secret
建立自動佈署要用到的設定值
arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
ap-northeast-1
(這邊要填入的是 lambda 所在的區域)AWS_ROLE_ARN 不確定的話可以直接到 AWS console 上看設定值:
建完 GitHub Secrets,就可以開始測試自動化工作流程啦!
⚠️ 如果在 IAM Role 定義的信任政策有限制可用分支,這裡選擇的 branch 就必須要符合設定範圍喔!
看到 AWS CLI 執行成功,代表 GitHub Actions 已能透過 OIDC 成功登入 AWS。
GitHub 上只有指定要使用哪一個 Role,那是不是有機會透過 OIDC 去 Assume 很多不同的 Role?
可以的!
OIDC 只是為 GitHub Actions 開通一條可以登入 AWS 的通道,並不能決定登入後可以使用哪些角色。
這樣不會很不安全嗎?
要是 GitHub 裡設定了其他 Role 的 ARN 是不是就會拿到不該有的操作權限?
不會!
可以回頭檢視一下設定 IAM Role 時定義的 信任政策
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRoleWithWebIdentity",
"Principal": {
"Federated": "arn:aws:iam::590184072539:oidc-provider/token.actions.githubusercontent.com"
},
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": [
"sts.amazonaws.com"
]
},
"StringLike": {
"token.actions.githubusercontent.com:sub": [
"repo:MinxSu/ITHome-ironman-2025:ref:refs/heads/develop"
]
}
}
}
]
}
其中 "Action": "sts:AssumeRoleWithWebIdentity"
就是在定義這個 Role 允許透過 Web Identity 取用。
而 Condition"
區塊則明確限制了:
aud
必須是 sts.amazonaws.com
sub
必須來自特定的 repo 與 branch所以並不是透過 OIDC 就能隨意 Assume 任何 Role 喔!